package com.chilli.cosima.common;

import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.chilli.cosima.data.bean.TOperator;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorityInterceptor extends AbstractInterceptor
{

	/**
	 * 注释内容
	 */
	private static final long serialVersionUID = -7679662357952998028L;

	private Log log = LogFactory.getLog(AuthorityInterceptor.class);

	private static final String TIMEOUT = "timeout";
	private static final String NOPERMISSION = "nopermission";

	// 拦截Action处理的拦截方法
	@SuppressWarnings("unchecked")
	public String intercept(ActionInvocation invocation) throws Exception
	{
		// 取得请求相关的ActionContext实例
		ActionContext ctx = invocation.getInvocationContext();
		Map session = ctx.getSession();
		// 取出名为operator的session属性
		TOperator operator = (TOperator) session.get("operator");
		// 如果没有登陆，返回重新登陆
		if (operator == null)
		{
			return TIMEOUT;
		}

		// 如果没有相应权限，则提示没有权限访问
		// 取得请求的Action名
		String name = invocation.getInvocationContext().getName(); // action
		// 的名称，在xml中配置的
		String namespace = invocation.getProxy().getNamespace(); // 获取到namespace，还能够获取到要执行的方法，class等

		if ((namespace != null) && (namespace.trim().length() > 0))
		{
			if ("/".equals(namespace.trim()))
			{
				// 说明是根路径，不需要再增加反斜杠了。
			} else
			{
				namespace += "/";
			}
		}

		String action = invocation.getProxy().getActionName();

		String URL = namespace + action;

		// 控制到action!method.action
//		String method = invocation.getProxy().getMethod();
//		  
//		if (method != null && !"".equals(method.trim()) && !"execute".equals(method.trim())) 
//		{
//			URL += "!" + method + ".action"; 
//		}
//		else 
//		{ 
//			URL += ".action"; 
//		}
		
		URL += ".action"; 

		// 去掉前面第一个/，跟powerlist严格匹配
		if (URL.startsWith("/"))
		{
			URL = URL.substring(1);
		}

		log.debug("actionname=" + name + "||fullActionName=" + URL);

		// 如果是frameAction，则不需要与powerlist进行比对,否则需要比对
		if (!action.equals("frameAction"))
		{
			List<String> powerUrlList = (List<String>) session
					.get("powerUrlList");

			// 如果没有此权限，则跳转到提示界面。
			if (!powerUrlList.contains(URL))
			{
				return NOPERMISSION;
			}
		}

		return invocation.invoke();
	}
}
